/* 
 * File:   PutCommand.cpp
 * Author: Bram
 * 
 * syntax: (zonder []!)
 * [put:"filename.ext"] = stuurt een file naar de root synxbox map op de server
 * [put:"filename.ext" "test"] = stuurt een file naar de root synxbox map op de server, in map "test" (maakt die map aan als die niet bestaat
 * [put:"a\filename.ext"] = stuurt een file uit de map "a" naar de root synxbox map op de server
 * [put:"a\filename.ext" "test"] = stuurt een file uit de map "a" naar de root synxbox map op de server, in map "test" (maakt die map aan als die niet bestaat
 * 
 * Created on January 22, 2013, 11:39 PM
 */


#include "PutCommand.h"
#include "Config.h"

PutCommand PutCommand::cInstance("PUT");

PutCommand::PutCommand(const char* szID )
	: SendReceiveCommand( szID )
{
}

PutCommand::PutCommand() : SendReceiveCommand() {
    setName("PUT");
}

PutCommand::PutCommand(const PutCommand& orig) {
}

PutCommand::~PutCommand() {
}

Command* PutCommand::createNew()
{
    PutCommand * cmd = new PutCommand();
    cmd->setName("PUT");
    return cmd;
}

//voor de put moeten er minimaal 2 parameters zijn
bool PutCommand::isValid()
{
    return ((getName().compare("PUT") == 0) && (sizeParameters() > 1) &&  SendReceiveCommand::isValid());
}

//hier ontvangt de server het commando van de client
void PutCommand::ExcecuteServerReceiveCommand(TcpSocket* dasServer, queue<Command *>& commandQueue)
{
    ReceiveFile(dasServer, commandQueue);
}
//hier komt de server nadat hij een bericht van de client heeft ontvangen met een del request
void PutCommand::ExcecuteServerSendCommand(TcpSocket* dasServer, queue<Command *>& commandQueue)
{
    //cout << getName() << " COMMAND - nothing send!" << endl;
    //dasLog << getName() << " COMMAND - nothing send!" << endl;
}

//dit wordt uitgevoerd als de client het naar de server HEEFT VERSTUURD 
//en gaat wachten op een antwoord!
void PutCommand::ExcecuteClientReceiveCommand(TcpSocket* dasClient, queue<Command *>& commandQueue)
{
    if(!(getName().compare("ERROR") == 0) ){ //als het geen error is
        SendFile(dasClient, commandQueue);
    }
}

//dit wordt uitgevoerd als de client het naar de server verstuurd, na het intypen in de terminal dus!
void PutCommand::ExcecuteClientSendCommand(TcpSocket* dasClient, queue<Command *>& commandQueue)
{
    //hier is het put commando net ingevuld
    //de 1e is het relatieve file path
    //de 2e is de subdir waar die moet komen op de server, op de server gezien vanaf het relatieve path
    string strFileName;
    string strSubDirOnServer;
    string basePath;
    string fullFilePath;
    string pathSEP = Config::getInstance()->PathSeparator;
    string errMSG;
    getParameterAtIndex(0,strFileName);
    getParameterAtIndex(1,strSubDirOnServer);
    Config::getInstance()->getFullBasePath(basePath);
    
    stringstream ss;
    ss << basePath << strFileName;
    fullFilePath = ss.str();
    
    if(!Utility::getInstance()->fileExists(fullFilePath)){
        errMSG = "FILE NOT EXISTS";
    }
    setType("START");
    //checkt of het command valide is
    if(!isValid() || (strFileName.size() < 1) || (errMSG.size() > 0)) {
        clearParameters();
        stringstream ssERROR;
        ssERROR << "ERROR on sending '" << getName() << "' - ";
        if(errMSG.size() > 0){
            
        } else if(strFileName.size() < 1){
            errMSG = "NO VALID FILENAME";
        } else {
            errMSG = "COMMAND NOT VALID!";
        }
        ssERROR << "ERROR 3011 - ERROR BUILDING COMMAND: " << errMSG << "!, ";
        ssERROR << "name: '" << getName()  << "', ";
        ssERROR << "sender: '" << getSender()  << "', ";
        ssERROR << "type: '" << getType()  << "', ";
        cout << ssERROR.str() << endl;
        dasLog << ssERROR.str() << endl;
        
        clearParameters();
        addParameter(ssERROR.str());
        setName("ERROR");
        //@TODO huidigge command error van maken, dat komt dan naar voren in de client receive
    } else { //als alles goed is
        string totalCommandStr = buildFullCommand();
        if(totalCommandStr.size() > 10){
            dasClient->sendMessage(totalCommandStr);
        } else {
            stringstream ss;
            ss << "ERROR in '" << __FILE__ << "' - '" << __FUNCTION__  << "()', if(totalCommandStr.size() > 10){ - should not ever happen! 88887" << endl;
            
            cout << ss.str();
            dasLog << ss.str();
            
            addParameter(ss.str());
            setName("ERROR");
            //@TODO huidigge command error van maken, dat komt dan naar voren in de client receive
        }
    }
}

